﻿//using Sgr.Exceptions;

//namespace Sgr.Data
//{
//    /// <summary>
//    /// 默认数据库连接字符串管理器
//    /// 负责管理和提供数据库连接字符串配置信息
//    /// </summary>
//    public class DefaultDataConnectionStringManager : IDataConnectionStringManager, IDisposable
//    {
//        /// <summary>
//        /// 读写锁，用于保护数据源字典的并发访问
//        /// </summary>
//        private readonly ReaderWriterLockSlim _lock;

//        /// <summary>
//        /// 数据源字典，存储所有的数据库连接配置
//        /// Key: 数据源名称（不区分大小写）
//        /// Value: 数据源配置信息
//        /// </summary>
//        private readonly Dictionary<string, DataConnectionString> _databaseSources;

//        /// <summary>
//        /// 数据源提供者集合
//        /// 用于加载数据库连接字符串配置
//        /// </summary>
//        private readonly IEnumerable<IDataConnectionStringProvider> _dataConnectionStringProviders;

//        /// <summary>
//        /// 是否已释放资源
//        /// </summary>
//        private volatile bool _disposed;

//        /// <summary>
//        /// 初始化默认数据库连接字符串管理器
//        /// </summary>
//        /// <param name="dataConnectionStringProviders">数据源提供者集合</param>
//        /// <exception cref="ArgumentNullException">当数据源提供者集合为空时抛出</exception>
//        public DefaultDataConnectionStringManager(IEnumerable<IDataConnectionStringProvider> dataConnectionStringProviders)
//        {
//            _dataConnectionStringProviders = dataConnectionStringProviders ??
//                throw new ArgumentNullException(nameof(dataConnectionStringProviders));

//            _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
//            _databaseSources = new Dictionary<string, DataConnectionString>(StringComparer.OrdinalIgnoreCase);

//            this.Reload();
//        }

//        /// <summary>
//        /// 重新加载所有数据源配置
//        /// </summary>
//        /// <exception cref="ObjectDisposedException">当对象已释放时抛出</exception>
//        public void Reload()
//        {
//            ThrowIfDisposed();

//            _lock.EnterWriteLock();
//            try
//            {
//                // 清空现有配置
//                _databaseSources.Clear();

//                // 从所有提供者加载配置
//                foreach (var provider in _dataConnectionStringProviders)
//                {
//                    try
//                    {
//                        var sources = provider.LoadDataConnectionStrings();
//                        if (sources != null)
//                        {
//                            foreach (var source in sources)
//                            {
//                                if (!string.IsNullOrWhiteSpace(source?.Name))
//                                {
//                                    _databaseSources[source.Name] = source;
//                                }
//                            }
//                        }
//                    }
//                    catch (Exception ex)
//                    {
//                        // 记录加载失败但继续处理其他提供者
//                        // TODO: 添加日志记录
//                        System.Diagnostics.Debug.WriteLine(
//                            $"从提供者 {provider.GetType().Name} 加载配置失败: {ex.Message}");
//                    }
//                }
//            }
//            finally
//            {
//                _lock.ExitWriteLock();
//            }
//        }

//        /// <summary>
//        /// 获取指定名称的数据源配置
//        /// </summary>
//        /// <param name="dataConnectionStringName">数据源名称</param>
//        /// <returns>数据源配置信息</returns>
//        /// <exception cref="ArgumentException">当数据源名称为空时抛出</exception>
//        /// <exception cref="BusinessException">当未找到指定数据源时抛出</exception>
//        /// <exception cref="ObjectDisposedException">当对象已释放时抛出</exception>
//        public DataConnectionString GetDataConnectionString(string dataConnectionStringName)
//        {
//            ThrowIfDisposed();

//            string key = string.IsNullOrEmpty(dataConnectionStringName)
//                ? Constant.DEFAULT_DATABASE_SOURCE_NAME : dataConnectionStringName;

//            _lock.EnterReadLock();
//            try
//            {
//                if (!_databaseSources.TryGetValue(key, out var source) || source == null)
//                {
//                    throw new BusinessException($"未设置[{key}]的数据连接字符串");
//                }

//                return source;
//            }
//            finally
//            {
//                _lock.ExitReadLock();
//            }
//        }

//        /// <summary>
//        /// 尝试获取指定名称的数据源配置
//        /// </summary>
//        /// <param name="dataConnectionStringName">数据源名称</param>
//        /// <param name="dataConnectionString">输出的数据源配置</param>
//        /// <returns>是否成功获取数据源配置</returns>
//        /// <exception cref="ObjectDisposedException">当对象已释放时抛出</exception>
//        public bool TryGetDataConnectionString(
//            string dataConnectionStringName,
//            out DataConnectionString? dataConnectionString)
//        {
//            ThrowIfDisposed();

//            _lock.EnterReadLock();
//            try
//            {
//                return _databaseSources.TryGetValue(dataConnectionStringName, out dataConnectionString);
//            }
//            finally
//            {
//                _lock.ExitReadLock();
//            }
//        }

//        /// <summary>
//        /// 检查对象是否已释放
//        /// </summary>
//        /// <exception cref="ObjectDisposedException">当对象已释放时抛出</exception>
//        protected void ThrowIfDisposed()
//        {
//            ObjectDisposedException.ThrowIf(_disposed, GetType().Name);
//        }

//        /// <summary>
//        /// 释放资源
//        /// </summary>
//        public void Dispose()
//        {
//            Dispose(true);
//            GC.SuppressFinalize(this);
//        }

//        /// <summary>
//        /// 释放资源
//        /// </summary>
//        /// <param name="disposing">是否正在释放托管资源</param>
//        protected virtual void Dispose(bool disposing)
//        {
//            //if (!_disposed)
//            //{
//            //    if (disposing)
//            //    {
//            //        _lock?.Dispose();
//            //    }
//            //    _disposed = true;
//            //}

//            if (!_disposed)
//            {
//                if (disposing)
//                {
//                    // 等待当前所有读/写完成，进入写锁以阻止新读/写
//                    _lock?.EnterWriteLock();
//                    try
//                    {
//                        _disposed = true;
//                    }
//                    finally
//                    {
//                        _lock?.ExitWriteLock();
//                    }

//                    // 现在安全地释放锁对象
//                    _lock?.Dispose();
//                }
//                _disposed = true;
//            }
//        }
//    }
//}